home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / news / readers / nn / nn6.4.patch1 < prev    next >
Encoding:
Text File  |  1990-05-10  |  29.0 KB  |  1,004 lines

  1.          This is an official patch to nn release 6.4
  2.          -------------------------------------------
  3.  
  4.                    PATCH #1
  5.  
  6.                 Priority: HIGH
  7.  
  8.  
  9. These patches fixes a number of bugs in the initial 6.4 release of nn
  10. as described in the updated RELEASE_NOTES file (read that for details
  11. about this patch).  Thanks to all who reported bugs and provided fixes.
  12.  
  13. Title:    Init file processing writes to string constant.
  14. From:    Sean Casey <sean@ms.uky.edu>
  15.     David Heath <dave@boingo.med.jhu.edu>
  16.  
  17. Title:    nnmaster -l always quits.
  18. From:    Sean Casey <sean@ms.uky.edu>
  19.     David Heath <dave@boingo.med.jhu.edu>
  20.     syd@dsinc.dsi.com (Syd Weinstein)
  21.  
  22. Title:    Database inconsistency always reported for some groups
  23. From:    syd@dsinc.dsi.com (Syd Weinstein)
  24.  
  25. Title:    Unsubscribed groups can interfere with merged groups.
  26. From:    Robert.Stockton@ELROND.GANDALF.CS.CMU.EDU
  27.  
  28. Title:    Y (overview) in "nn -X" mode doesn't show unsubscribed groups.
  29. From:    KFS
  30.  
  31. Title:    'y' response to Abort? is not recognized
  32. From:    Mark Nagel <nagel@ics.UCI.EDU>
  33.  
  34. Title:    Cannot set "included-mark" to blanks
  35. From:    beldar@mips.com (Gardner Cohen)
  36.  
  37. Title:    Some lines are ignored in manuals
  38. From:    Peter Andersen <datpete@daimi.dk>
  39.  
  40. Title:    Escape codes are always turned into ^[ form.
  41. From:    Piet Beertema <piet@cwi.nl>
  42.  
  43. Title:    Bug in generation of message-id line
  44. From:    Pekka Kyt|laakso <netmgr@csc.fi>  + fix
  45.  
  46. Title:    G command may leave group "active".
  47. From:    Greg Onufer <exodus@cherrs2.Eng.Sun.COM>
  48.     Scott Boyd <scott@Futures.COM>
  49.  
  50. Title:    nngrab uses egrep -i
  51. From:    pete@eleazar.dartmouth.edu (Pete Schmitt)
  52.  
  53. Title:    Folder subarticles span to end of file (only NNTP).
  54. From:    Robert.Stockton@ELROND.GANDALF.CS.CMU.EDU
  55.  
  56. Title:    help commands shows wrong info for new commands
  57. From:    netmgr@csc.FI (Pekka Kytolaakso)
  58.  
  59. Title:    Groups may be removed from database due to disk full. (nntp)
  60. From:    KFS
  61.  
  62. ++Kim Storm
  63.  
  64. *** ./LAST/admin.c    Sat May  5 14:11:43 1990
  65. --- admin.c    Thu May 10 11:49:29 1990
  66. ***************
  67. *** 356,361 ****
  68. --- 356,369 ----
  69.       data_offset = ftell(data);
  70.       if (data_offset != gh->data_write_offset)
  71.           valerr(("DATA OFFSET %ld != %ld", (long)gh->data_write_offset, (long)data_offset), 9);
  72. +     while (++cur_article <= gh->last_db_article) {
  73. +         if (!db_read_offset(ix, &next_offset))
  74. +         valerr(("NO INDEX FOR ARTICLE %ld", (long)cur_article), 12);
  75. +         if (data_offset != next_offset)
  76. +         valerr(("OFFSET ERROR: %ld: %ld != %ld", (long)cur_article, (long)data_offset, (long)next_offset), 13);
  77. +     }
  78.       data_offset = ftell(ix);
  79.       if (data_offset != gh->index_write_offset)
  80.           valerr(("INDEX OFFSET %ld != %ld", (long)gh->index_write_offset, (long)data_offset), 10);
  81. *** ./LAST/answer.c    Wed May  2 10:35:56 1990
  82. --- answer.c    Wed May  9 19:20:03 1990
  83. ***************
  84. *** 70,76 ****
  85.   
  86.       fprintf(t, "Path: %s!%s\n", host, user_name());
  87.       fprintf(t, "Date: %s %s %s %s GMT\n", date+8, date+4, date+22, date+11);
  88. !     fprintf(t, "Message-ID: <%s.%ld@%s>\n", user_name, (long)now, host);
  89.       ed_line += 3;
  90.   }
  91.   #endif
  92. --- 70,76 ----
  93.   
  94.       fprintf(t, "Path: %s!%s\n", host, user_name());
  95.       fprintf(t, "Date: %s %s %s %s GMT\n", date+8, date+4, date+22, date+11);
  96. !     fprintf(t, "Message-ID: <%s.%ld@%s>\n", user_name(), (long)now, host);
  97.       ed_line += 3;
  98.   }
  99.   #endif
  100. ***************
  101. *** 202,208 ****
  102. --- 202,212 ----
  103.   FILE *f;
  104.   char *name, *str;
  105.   {
  106. +     int xport = (*name == '*');
  107. +     
  108. +     if (xport) name++;
  109.       fprintf(f, "%s='%s'\n", name, str != NULL ? str : "");
  110. +     if (xport) fprintf(f, "export %s\n", name);
  111.   }
  112.   
  113.   static aux_param_int(f, name, i)
  114. ***************
  115. *** 257,263 ****
  116.       aux_param_str(param, "DFLT_ANSW", response_dflt_answer);
  117.   
  118.       if (current_group != NULL) {
  119. !         aux_param_str(param, "G", current_group->group_name);
  120.           if (ah == NULL)
  121.           fn = NULL;
  122.           else
  123. --- 261,267 ----
  124.       aux_param_str(param, "DFLT_ANSW", response_dflt_answer);
  125.   
  126.       if (current_group != NULL) {
  127. !         aux_param_str(param, "*G", current_group->group_name);
  128.           if (ah == NULL)
  129.           fn = NULL;
  130.           else
  131. ***************
  132. *** 267,273 ****
  133.           else
  134.   #endif
  135.           fn = group_path_name;
  136. !         aux_param_str(param, "A", fn != NULL ? fn : "");
  137.       }
  138.   
  139.       /*
  140. --- 271,277 ----
  141.           else
  142.   #endif
  143.           fn = group_path_name;
  144. !         aux_param_str(param, "*A", fn != NULL ? fn : "");
  145.       }
  146.   
  147.       /*
  148. *** ./LAST/articles.c    Thu Apr 26 19:56:03 1990
  149. --- articles.c    Thu May 10 11:09:46 1990
  150. ***************
  151. *** 360,365 ****
  152. --- 360,366 ----
  153.       if (ah->a_number > last_article) break;
  154.   
  155.       if (flags & ACC_SPEW_MODE) {
  156. +         fold_string(db_data.dh_subject);
  157.           printf("%x:%s\n", (int)(gh->group_num), db_data.dh_subject);
  158.           continue;
  159.       }
  160. *** ./LAST/aux.sh    Wed Apr 25 21:31:59 1990
  161. --- aux.sh    Wed May  9 12:29:27 1990
  162. ***************
  163. *** 94,100 ****
  164.       ${AWK} 'END{printf "Confirm abort: (y) "}' < /dev/null
  165.       read act
  166.       case "$act" in
  167. !     ""|"y*") rm -f $WORK $COPY ;
  168.            exit 22 ;;
  169.       esac
  170.       ;;
  171. --- 94,100 ----
  172.       ${AWK} 'END{printf "Confirm abort: (y) "}' < /dev/null
  173.       read act
  174.       case "$act" in
  175. !     ""|y*) rm -f $WORK $COPY ;
  176.            exit 22 ;;
  177.       esac
  178.       ;;
  179. *** ./LAST/collect.c    Wed May  2 00:03:36 1990
  180. --- collect.c    Thu May 10 11:20:31 1990
  181. ***************
  182. *** 469,478 ****
  183.       }
  184.   
  185.        unblock_group:
  186. !     if (temp > 0 || (gh->master_flag & M_BLOCKED)) {
  187. !         gh->master_flag &= ~(M_EXPIRE | M_BLOCKED);
  188. !         db_write_group(gh);
  189. !     }
  190.       }
  191.   
  192.       if (col_article_count > 0)
  193. --- 469,476 ----
  194.       }
  195.   
  196.        unblock_group:
  197. !     gh->master_flag &= ~(M_EXPIRE | M_BLOCKED);
  198. !     db_write_group(gh);
  199.       }
  200.   
  201.       if (col_article_count > 0)
  202. *** ./LAST/db.c    Sat May  5 18:25:56 1990
  203. --- db.c    Tue May  8 13:36:37 1990
  204. ***************
  205. *** 6,11 ****
  206. --- 6,12 ----
  207.   
  208.   #include "config.h"
  209.   #include "db.h"
  210. + #include <errno.h>
  211.   
  212.   import char
  213.       *master_directory, *db_directory, *db_data_directory, *news_directory;
  214. ***************
  215. *** 558,563 ****
  216. --- 559,565 ----
  217.   char d_or_x;
  218.   int mode;
  219.   {
  220. +     FILE *f;
  221.       char data_file[FILENAME];
  222.   
  223.       db_data_path(data_file, gh, d_or_x);
  224. ***************
  225. *** 564,572 ****
  226.   
  227.       if (mode == -1) {
  228.       unlink(data_file);
  229. !     return (FILE *)NULL;
  230. !     } else
  231. !     return open_file(data_file, mode);
  232.   }
  233.   
  234.   
  235. --- 566,580 ----
  236.   
  237.       if (mode == -1) {
  238.       unlink(data_file);
  239. !     f = NULL;
  240. !     } else {
  241. !     f = open_file(data_file, (mode & ~MUST_EXIST));
  242. !     if (f == NULL && (mode & MUST_EXIST))
  243. !         sys_error("%s (%d): cannot open '%c' file (mode=%x, errno=%d)",
  244. !               gh->group_name, (int)(gh->group_num), d_or_x,
  245. !               mode, errno);
  246. !     }
  247. !     return f;
  248.   }
  249.   
  250.   
  251. *** ./LAST/doc/RELEASE_NOTES    Sat May  5 15:56:49 1990
  252. --- doc/RELEASE_NOTES    Thu May 10 14:45:29 1990
  253. ***************
  254. *** 1,6 ****
  255. ! Release 6.4.0 known problems
  256. ! ----------------------------
  257.   
  258.   Prog:    nn
  259.   Title:    G= in merged groups
  260.   
  261. --- 1,13 ----
  262. ! Known problems in release 6.4
  263. ! -----------------------------
  264.   
  265. + Prog:    nnmaster - nntp
  266. + Title:    nnmaster may hang if nntp server dies.
  267. + From:    Rene Seindal <seindal@diku.dk>
  268. +     Keep-alive must be set on the nntp socket to be able to notify
  269. +     the nnmaster that the server has died (via sigpipe).
  270.   Prog:    nn
  271.   Title:    G= in merged groups
  272.   
  273. ***************
  274. *** 103,105 ****
  275. --- 110,254 ----
  276.   Title:    Shell layers are not supported.
  277.   
  278.       ^Z is eaten by nn so shell layers don't work.
  279. + Prog:    nn
  280. + Title:    Init file processing writes to string constant.
  281. + From:    Sean Casey <sean@ms.uky.edu>
  282. +     David Heath <dave@boingo.med.jhu.edu>
  283. + Fixed:    Patch #1 [init.c]
  284. +     If one doesn't use "-fwritable-strings" with gcc, nnadmin core
  285. +     dumps because of some code in the process init file section.
  286. +     It tries to write to the string "init,", which may be in the
  287. +     text segment.
  288. + Prog:    nnmaster
  289. + Title:    nnmaster -l always quits.
  290. + From:    Sean Casey <sean@ms.uky.edu>
  291. +     David Heath <dave@boingo.med.jhu.edu>
  292. +     syd@dsinc.dsi.com (Syd Weinstein)
  293. + Fixed:    Patch #1 [master.c]
  294. +     Anytime I give the -l flag to nnmaster, it quits with:
  295. +         E: May  7 15:05 (M): Incomplete MASTER file
  296. + Prog:    nnmaster
  297. + Title:    Database inconsistency always reported for some groups
  298. + From:    syd@dsinc.dsi.com (Syd Weinstein)
  299. + Fixed:    Patch #1 [admin.c collect.c]
  300. +     Some groups always reports inconsistencies even after recollection.
  301. +     (It turns out that if the highest numbered article(s) in a group does
  302. +     not exist, the validation of the index fails, and furthermore, if
  303. +     only non-existing articles are "collected" in a group by nnmaster,
  304. +     the group header is not saved in the database.  ++Kim)
  305. +     
  306. + Prog:    nn
  307. + Title:    Unsubscribed groups can interfere with merged groups.
  308. + From:    Robert.Stockton@ELROND.GANDALF.CS.CMU.EDU
  309. + Fixed:    Patch #1 [sequence.c]
  310. +     Unsubscribed groups foul up merging of the form "foo*,".  The
  311. +     "Next Group" command may show you some of the merged groups again.
  312. + Prog:    nn
  313. + Title:    Remapping keys may interfere with Junk command.
  314. + From:    Robert.Stockton@ELROND.GANDALF.CS.CMU.EDU
  315. +     Menu mode macros are invoked when the appropriate keystrokes are used
  316. +     in the Junk command.  For example, when I rebound 'N' in menu mode to
  317. +     a macro, it interfered with Junking of "Leave-Next" articles.
  318. + Prog:    nn
  319. + Title:    Y (overview) in "nn -X" mode doesn't show unsubscribed groups.
  320. + Fixed:    Patch #1 [group.c]
  321. +     "nn -X" includes unsubscribed groups in the sequence, but they are
  322. +     not shown on the group overview.
  323. + Prog:    aux
  324. + Title:    'y' response to Abort? is not recognized
  325. + From:    Mark Nagel <nagel@ics.UCI.EDU>
  326. + Fixed:    Patch #1 [aux.sh]
  327. +     If you try to abort a posting, and you actually type 'y' and
  328. +     return, it doesn't work.
  329. + Prog:    nn
  330. + Title:    Cannot set "included-mark" to blanks
  331. + From:    beldar@mips.com (Gardner Cohen)
  332. + Fixed:    Patch #1 [init.c] -- need to put \ before first space.
  333. +     My preferred indented prefix is three blanks, which I haven't been
  334. +     able to set in my init in the past (is it possible now?).
  335. + Prog:    manuals
  336. + Title:    Some lines are ignored
  337. + From:    Peter Andersen <datpete@daimi.dk>
  338. + Fixed:    Patch #1 [nn.1 nnmaster.8]
  339. +     Some text lines in the manuals contain a period at the beginning
  340. +     of a line; this is mis-interpreted as an nroff command.
  341. + Prog:    nn
  342. + Title:    Escape codes are always turned into ^[ form.
  343. + From:    Piet Beertema <piet@cwi.nl>
  344. + Fixed:    Patch #1 [more.c variable.c nn.1] -- new trusted-escape-codes var.
  345. +     I encountered problems with both rn and nn, which wouldn't properly
  346. +     display in kanji: the ESC char was "escaped", i.e. displayed as ^[
  347. +     But kanji encoding uses the ESC, so escaping them obviously messes up
  348. +     things.     [You must fix inews also - it normally discards ESC]
  349. + Prog:    nn
  350. + Title:    Bug in generation of message-id line
  351. + From:    Pekka Kyt|laakso <netmgr@csc.fi>  + fix
  352. + Fixed:    Patch #1 [answer.c]
  353. +     user_name is "called" without ().
  354. + Prog:    nn
  355. + Title:    G command may leave group "active".
  356. + From:    Greg Onufer <exodus@cherrs2.Eng.Sun.COM>
  357. +     Scott Boyd <scott@Futures.COM>
  358. + Fixed:    Patch #1 [group.c]
  359. +     
  360. +     G group @ with no archive file leaved group active.
  361. +     group-group command fails with "groupname is an active group" on
  362. +     2nd attempt, if no articles were found on 1st attempt.
  363. + Prog:    nngrab
  364. + Title:    nngrab uses egrep -i
  365. + From:    pete@eleazar.dartmouth.edu (Pete Schmitt)
  366. + Fixed:    Patch #1 [articles.c nngrab.sh]
  367. +     nngrab uses egrep with a -i option.  This option is only valid for
  368. +     grep and fgrep on BSD 4.3 -- i.e. it is not portable.
  369. + Prog:    nn
  370. + Title:    Folder subarticles span to end of file (only NNTP).
  371. + From:    Robert.Stockton@ELROND.GANDALF.CS.CMU.EDU
  372. + Fixed:    Patch #1 [news.c]
  373. +     When you use the 'G' command to view an article in a folder, it shows
  374. +     you the entire contents of the folder from that point rather than the
  375. +     single article requested.  (This only happens with NNTP  ++Kim)
  376. + Prog:    nn
  377. + Title:    help commands shows wrong info for new commands
  378. + From:    netmgr@csc.FI (Pekka Kytolaakso)
  379. + Fixed:    Patch #1 [help.commands]
  380. +     There's an error in the file help commands. It still uses 'L' as the
  381. +     'change layout' key (in selection mode) and dosn't say anything about
  382. +     the news use of the L key.
  383. + Prog:    nnmaster - nntp_get_active
  384. + Title:    Groups may be removed from database due to disk full.
  385. + From:    KFS
  386. + Fixed:    Patch #1 [nntp.c]
  387. +     If the disk runs full while the active file is fetched from an nntp
  388. +     server, the incomplete active file is believed to be the complete
  389. +     active file.  This causes nnmaster to remove the groups which didn't
  390. +     get written to the active file.
  391. *** ./LAST/group.c    Wed May  2 10:35:56 1990
  392. --- group.c    Wed May  9 18:50:20 1990
  393. ***************
  394. *** 330,349 ****
  395.       n = 1;            /* must unsort articles */
  396.       if (mg_head != NULL) gh = mg_head;
  397.   
  398. !     if (!no_update) {
  399. !     do {
  400. !         if (mask == NULL && (access_mode & ACC_ALSO_READ_ARTICLES) == 0
  401. !         && first_art < 0) {
  402. !         if (menu_cmd != ME_NO_ARTICLES) gh->group_flag &= ~G_NEW;
  403. !         if ((gh->group_flag & G_UNSUBSCRIBED) == 0 || keep_unsub_long) {
  404. !             if (n) sort_articles(0);
  405. !             n = 0;
  406. !             update_rc(gh);
  407. !         }
  408. !         }
  409. !         gh->current_first = 0;
  410. !     } while (mg_head != NULL && (gh = gh->merge_with) != NULL);
  411. !     }
  412.   
  413.       killed_articles = o_killed;
  414.       restore_variables();
  415. --- 330,345 ----
  416.       n = 1;            /* must unsort articles */
  417.       if (mg_head != NULL) gh = mg_head;
  418.   
  419. !     do {
  420. !     gh->current_first = 0;
  421. !     if (mask != NULL) continue;
  422. !     if (access_mode & ACC_ALSO_READ_ARTICLES || first_art >= 0) continue;
  423. !     if (menu_cmd != ME_NO_ARTICLES) gh->group_flag &= ~G_NEW;
  424. !     if (gh->group_flag & G_UNSUBSCRIBED && !keep_unsub_long) continue;
  425. !     if (n) sort_articles(0);
  426. !     n = 0;
  427. !     update_rc(gh);
  428. !     } while (mg_head != NULL && (gh = gh->merge_with) != NULL);
  429.   
  430.       killed_articles = o_killed;
  431.       restore_variables();
  432. ***************
  433. *** 744,751 ****
  434.       release_memory(&mem_marker);
  435.   
  436.   goto_exit:
  437. !     if (gh != orig_group)
  438.       if (orig_group) init_group(orig_group);
  439.   
  440.       m_endinput();
  441.       return menu_cmd;
  442. --- 740,749 ----
  443.       release_memory(&mem_marker);
  444.   
  445.   goto_exit:
  446. !     if (gh != orig_group) {
  447. !     gh->current_first = 0;
  448.       if (orig_group) init_group(orig_group);
  449. +     }
  450.   
  451.       m_endinput();
  452.       return menu_cmd;
  453. ***************
  454. *** 924,931 ****
  455.       Loop_Groups_Sequence(gh) {
  456.           if (gh->group_flag & G_FAKED) continue;
  457.           if (gh->master_flag & M_NO_DIRECTORY) continue;
  458. !         if (gh != current_group)
  459. !         if ((gh->group_flag & G_COUNTED) == 0) continue;
  460.           if (disp_group(gh) < 0) break;
  461.       }
  462.       } else
  463. --- 922,932 ----
  464.       Loop_Groups_Sequence(gh) {
  465.           if (gh->group_flag & G_FAKED) continue;
  466.           if (gh->master_flag & M_NO_DIRECTORY) continue;
  467. !         if (gh != current_group) {
  468. !         if (gh->unread_count <= 0) continue;
  469. !         if (gh->group_flag & G_UNSUBSCRIBED && !also_unsub_groups)
  470. !             continue;
  471. !         }
  472.           if (disp_group(gh) < 0) break;
  473.       }
  474.       } else
  475. *** ./LAST/help/help.commands    Mon Apr 23 18:32:36 1990
  476. --- help/help.commands    Thu May 10 13:05:41 1990
  477. ***************
  478. *** 21,28 ****
  479.   help        ?    ?    online help
  480.   junk-articles    J        change marking of articles on the menu
  481.   kill-select    K    K    kill/select handling
  482. ! layout        L        change menu layout
  483.   leave-article    l    l    leave (mark) article for later use
  484.   line+1        down    CR    next menu line/scroll one line
  485.   line-1        up        previous menu line
  486.   line=@            g    goto specific line
  487. --- 21,29 ----
  488.   help        ?    ?    online help
  489.   junk-articles    J        change marking of articles on the menu
  490.   kill-select    K    K    kill/select handling
  491. ! layout        "        change menu layout
  492.   leave-article    l    l    leave (mark) article for later use
  493. + leave-next    L    L    permanently mark article for later use
  494.   line+1        down    CR    next menu line/scroll one line
  495.   line-1        up        previous menu line
  496.   line=@            g    goto specific line
  497. *** ./LAST/init.c    Fri Apr 27 20:23:00 1990
  498. --- init.c    Wed May  9 17:48:37 1990
  499. ***************
  500. *** 53,58 ****
  501. --- 53,59 ----
  502.       if (cmd == NULL) return cmd;
  503.   
  504.       while (*cmd && isspace(*cmd)) cmd++;
  505. +     if (*cmd == '\\' && isspace(cmd[1])) cmd++;
  506.       if (*cmd == NUL || *cmd == NL) return NULL;
  507.   
  508.       return cmd;
  509. ***************
  510. *** 172,177 ****
  511. --- 173,180 ----
  512.       fclose(init);
  513.   }
  514.   
  515. + static char dflt_init_files[] = ",init";
  516.   visit_init_file(only_seq, first_arg)
  517.   int only_seq;
  518.   char *first_arg;
  519. ***************
  520. *** 183,189 ****
  521.       if (first_arg[2] == NUL) return;
  522.       first_arg += 2;
  523.       } else
  524. !     first_arg = ",init";
  525.   
  526.       in_init = 1;
  527.       while (first_arg) {
  528. --- 186,192 ----
  529.       if (first_arg[2] == NUL) return;
  530.       first_arg += 2;
  531.       } else
  532. !     first_arg = dflt_init_files;
  533.   
  534.       in_init = 1;
  535.       while (first_arg) {
  536. ***************
  537. *** 540,546 ****
  538.   
  539.           clrdisp();
  540.   
  541. !         printf("Available: %ld - %ld  (unread %ld)\n\n",
  542.              (long)(gh->first_db_article), (long)(gh->last_db_article),
  543.              (long)(gh->unread_count));
  544.           printf(".newsrc:\n\r>%s\r<%s\n\rselect:\n\r>%s\r<%s\n\r",
  545. --- 543,549 ----
  546.   
  547.           clrdisp();
  548.   
  549. !         printf("Available: %ld - %ld  (unread %ld)\n\n\r",
  550.              (long)(gh->first_db_article), (long)(gh->last_db_article),
  551.              (long)(gh->unread_count));
  552.           printf(".newsrc:\n\r>%s\r<%s\n\rselect:\n\r>%s\r<%s\n\r",
  553. *** ./LAST/man/nn.1.A    Sat May  5 14:19:09 1990
  554. --- man/nn.1.A    Thu May 10 14:53:46 1990
  555. ***************
  556. *** 878,884 ****
  557.   \fBRelated variables\fP:
  558.   case-fold-search, compress, data-bits, date, header-lines,
  559.   mark-overlap, monitor, overlap, scroll-clear-page, stop,
  560. ! wrap-header-margin.
  561.   .SH PREVIEWING ARTICLES IN SELECTION MODE
  562.   In selection mode, it is possible to read a specific article on the
  563.   menu without entering reading mode for all the selected articles on
  564. --- 878,884 ----
  565.   \fBRelated variables\fP:
  566.   case-fold-search, compress, data-bits, date, header-lines,
  567.   mark-overlap, monitor, overlap, scroll-clear-page, stop,
  568. ! trusted-escape-codes, wrap-header-margin.
  569.   .SH PREVIEWING ARTICLES IN SELECTION MODE
  570.   In selection mode, it is possible to read a specific article on the
  571.   menu without entering reading mode for all the selected articles on
  572. *** ./LAST/man/nn.1.C    Sat May  5 14:19:09 1990
  573. --- man/nn.1.C    Thu May 10 14:53:46 1990
  574. ***************
  575. *** 700,706 ****
  576.   is done by simple subtracting the first unread article number from the
  577.   total number of articles in each group.  This is very fast, and fairly
  578.   accurate but it may be a bit too large.  If not set, each line in
  579. ! .newsrc will be interpreted to count every unread article, thus giving
  580.   a very accurate number.  This variable is also used by \fInncheck\fP.
  581.   .TP
  582.   \fBquick-save\fP    (boolean, default false)
  583. --- 700,706 ----
  584.   is done by simple subtracting the first unread article number from the
  585.   total number of articles in each group.  This is very fast, and fairly
  586.   accurate but it may be a bit too large.  If not set, each line in
  587. ! \&.newsrc will be interpreted to count every unread article, thus giving
  588.   a very accurate number.  This variable is also used by \fInncheck\fP.
  589.   .TP
  590.   \fBquick-save\fP    (boolean, default false)
  591. ***************
  592. *** 920,925 ****
  593. --- 920,939 ----
  594.   .I sysline (1)
  595.   utility.
  596.   .TP
  597. + \fBtrusted-escape-codes\fP \fIcodes\fP    (string, default none)
  598. + When set to a list of one or more characters, \fInn\fP will trust and
  599. + output \fIescape\fP characters in an article if it is followed by one
  600. + of the characters in the list.  For example, to switch to or from
  601. + kanji mode, control codes like "\fIesc\fP\ $" and "\fIesc\fP\ (\ J"
  602. + may be present in the text.  To allow these codes, use the following
  603. + command:
  604. + .sp 0.5v
  605. +     set trusted-escape-codes ($
  606. + .sp 0.5v
  607. + You can also set it to \fBall\fP to pass all espace codes through to
  608. + the screen.  Notice that \fInn\fP thinks all characters (including
  609. + \fIesc\fP) output to the screen as occupy one column.
  610. + .TP
  611.   \fBunshar-command\fP \fIshell-command\fP    (string, default "/bin/sh")
  612.   This is the command which is invoked by the \fBunshar\fP command.
  613.   .TP
  614. ***************
  615. *** 936,942 ****
  616.   When set, unsubscribing to a group will automatically mark all current
  617.   articles read; this is recommended to keep the size of .newsrc down.
  618.   Otherwise, unread articles in the unsubscribe groups are kept in
  619. ! .newsrc.  If \fBkeep-unsubscribed\fP is false, this variable has no
  620.   effect.
  621.   .TP
  622.   \fBupdate-frequency\fP        (integer, default 1)
  623. --- 950,956 ----
  624.   When set, unsubscribing to a group will automatically mark all current
  625.   articles read; this is recommended to keep the size of .newsrc down.
  626.   Otherwise, unread articles in the unsubscribe groups are kept in
  627. ! \&.newsrc.  If \fBkeep-unsubscribed\fP is false, this variable has no
  628.   effect.
  629.   .TP
  630.   \fBupdate-frequency\fP        (integer, default 1)
  631. *** ./LAST/man/nn.1.D    Sat May  5 14:19:09 1990
  632. --- man/nn.1.D    Thu May 10 14:53:46 1990
  633. ***************
  634. *** 1055,1063 ****
  635.   .TP
  636.   \fBRC\fP
  637.   This is a pseudo group name which matches all groups occurring in the
  638. ! .newsrc file.  It will cause the groups in .newsrc to be appended to
  639.   the presentation sequence in the sequence in which they are listed in
  640. ! .newsrc.
  641.   .TP
  642.   \fBRC:\fP\fInumber\fP
  643.   Similar to the \fBRC\fP entry, but limited to the first \fInumber\fP
  644. --- 1055,1063 ----
  645.   .TP
  646.   \fBRC\fP
  647.   This is a pseudo group name which matches all groups occurring in the
  648. ! \&.newsrc file.  It will cause the groups in .newsrc to be appended to
  649.   the presentation sequence in the sequence in which they are listed in
  650. ! \&.newsrc.
  651.   .TP
  652.   \fBRC:\fP\fInumber\fP
  653.   Similar to the \fBRC\fP entry, but limited to the first \fInumber\fP
  654. *** ./LAST/man/nnmaster.8    Sat May  5 14:11:44 1990
  655. --- man/nnmaster.8    Wed May  9 20:34:09 1990
  656. ***************
  657. *** 483,489 ****
  658.   .br
  659.   $db/DATA/\fInnn\fP.[dx]    Database files for group number \fInnn\fP
  660.   .br
  661. ! .../.nn[dx]    Database files if located in the group directories
  662.   .br
  663.   $master/GATE    Message channel from \fInnadmin\fP to \fInnmaster\fP
  664.   .br
  665. --- 483,489 ----
  666.   .br
  667.   $db/DATA/\fInnn\fP.[dx]    Database files for group number \fInnn\fP
  668.   .br
  669. ! \&.../.nn[dx]    Database files if located in the group directories
  670.   .br
  671.   $master/GATE    Message channel from \fInnadmin\fP to \fInnmaster\fP
  672.   .br
  673. *** ./LAST/master.c    Sat May  5 18:25:56 1990
  674. --- master.c    Tue May  8 16:09:52 1990
  675. ***************
  676. *** 512,520 ****
  677.   
  678.   static set_lock_message()
  679.   {
  680. -     open_master(OPEN_UPDATE);
  681. -     db_read_master();
  682.       if (lock_message[0] || master.db_lock[0]) {
  683.       strncpy(master.db_lock, lock_message, DB_LOCK_MESSAGE);
  684.       master.db_lock[DB_LOCK_MESSAGE-1] = NUL;
  685.       db_write_master();
  686. --- 512,519 ----
  687.   
  688.   static set_lock_message()
  689.   {
  690.       if (lock_message[0] || master.db_lock[0]) {
  691. +     open_master(OPEN_UPDATE);
  692.       strncpy(master.db_lock, lock_message, DB_LOCK_MESSAGE);
  693.       master.db_lock[DB_LOCK_MESSAGE-1] = NUL;
  694.       db_write_master();
  695. ***************
  696. *** 612,617 ****
  697. --- 611,618 ----
  698.       nn_exit(0);
  699.       }
  700.   
  701. +     open_master(OPEN_READ);
  702.       if (lock_message != NULL) {
  703.       set_lock_message();
  704.       if (repeat_delay == 0 && !foreground &&
  705. ***************
  706. *** 618,625 ****
  707.           !reread_groups_file && group_selection == 0)
  708.           nn_exit(0);
  709.       }
  710. -     open_master(OPEN_READ);
  711.   
  712.       if (!ignore_lock && master.db_lock[0]) {
  713.       printf("Database locked (unlock with -l or ignore with -i)\n");
  714. --- 619,624 ----
  715. *** ./LAST/more.c    Mon Apr 23 18:26:06 1990
  716. --- more.c    Wed May  9 20:39:40 1990
  717. ***************
  718. *** 23,28 ****
  719. --- 23,29 ----
  720.   export int  data_bits = 7;
  721.   export int  scroll_clear_page = 1;
  722.   export int  expired_msg_delay = 1;
  723. + export char *trusted_escapes = NULL;
  724.   
  725.   import int  preview_window;
  726.   import int  novice;
  727. ***************
  728. *** 542,547 ****
  729. --- 543,565 ----
  730.           } while (col & 07);
  731.           goto next_char;
  732.   
  733. +      case 033: /* ESC may be a start/end of kanji or similar */
  734. +         if (trusted_escapes != NULL) {
  735. +         if (col + 3 > Columns) {
  736. +             ungetc(c, art);
  737. +             goto long_line;
  738. +         }
  739. +         if (strcmp(trusted_escapes, "all") == 0) break;
  740. +         c = getc(art);
  741. +         if (c == EOF) goto next_char;
  742. +         ungetc(c, art);
  743. +         for (fname = trusted_escapes; *fname; fname++)
  744. +             if (c == *fname) break;
  745. +         c = 033;
  746. +         if (*fname != NUL) break;
  747. +         }
  748. +         /* FALL THRU */
  749. +             
  750.        default:
  751.           if (col + 2 > Columns) {
  752.           ungetc(c, art);
  753. *** ./LAST/news.c    Wed May  2 22:19:53 1990
  754. --- news.c    Thu May 10 11:09:45 1990
  755. ***************
  756. *** 283,289 ****
  757.           news.ng_lpos = ftell(f);
  758.       }
  759.   #ifdef NNTP
  760. !     else if (use_nntp && (art->flag & A_DIGEST) == 0) {
  761.           fseek(f, (off_t)0, 2);
  762.           art->lpos = ftell(f);
  763.       }
  764. --- 283,289 ----
  765.           news.ng_lpos = ftell(f);
  766.       }
  767.   #ifdef NNTP
  768. !     else if (use_nntp && (art->flag & (A_DIGEST | A_FOLDER)) == 0) {
  769.           fseek(f, (off_t)0, 2);
  770.           art->lpos = ftell(f);
  771.       }
  772. ***************
  773. *** 305,311 ****
  774.       digest_buffer = buffer2;
  775.       }
  776.   #ifdef NNTP
  777. !     else if (use_nntp && (art->flag & A_DIGEST) == 0) {
  778.       fseek(f, (off_t)0, 2);
  779.       art->lpos = ftell(f);
  780.       }
  781. --- 305,311 ----
  782.       digest_buffer = buffer2;
  783.       }
  784.   #ifdef NNTP
  785. !     else if (use_nntp && (art->flag & (A_DIGEST | A_FOLDER)) == 0) {
  786.       fseek(f, (off_t)0, 2);
  787.       art->lpos = ftell(f);
  788.       }
  789. *** ./LAST/nngrab.sh    Sun Apr 29 15:54:28 1990
  790. --- nngrab.sh    Thu May 10 11:09:46 1990
  791. ***************
  792. *** 14,20 ****
  793.   fi
  794.   
  795.   if [ -s $DB/subjects ] ; then
  796. !     egrep -i "^[^:]*:.*$1" $DB/subjects |
  797.       sed 's/^\([^:]*\):.*/\1/' |
  798.       uniq > $TMP/nngrab$$
  799.   
  800. --- 14,20 ----
  801.   fi
  802.   
  803.   if [ -s $DB/subjects ] ; then
  804. !     egrep "^[^:]*:.*$1" $DB/subjects |
  805.       sed 's/^\([^:]*\):.*/\1/' |
  806.       uniq > $TMP/nngrab$$
  807.   
  808. *** ./LAST/nntp.c    Sat May  5 18:25:56 1990
  809. --- nntp.c    Thu May 10 14:50:17 1990
  810. ***************
  811. *** 688,694 ****
  812.       switch (n = ask_server("LIST")) {
  813.        case OK_GROUPS:
  814.       new = open_file(new_name, OPEN_CREATE_RW|MUST_EXIST);
  815. !     if (copy_text(new) == 0) break;
  816.       unlink(new_name);
  817.       if (!nntp_failed) {
  818.           log_entry('N', "LIST empty");
  819. --- 688,697 ----
  820.       switch (n = ask_server("LIST")) {
  821.        case OK_GROUPS:
  822.       new = open_file(new_name, OPEN_CREATE_RW|MUST_EXIST);
  823. !     if (copy_text(new) == 0) {
  824. !         if (fflush(new) != EOF) break;
  825. !         fclose(new);
  826. !     }
  827.       unlink(new_name);
  828.       if (!nntp_failed) {
  829.           log_entry('N', "LIST empty");
  830. ***************
  831. *** 886,894 ****
  832.       if (mode == 1 && !last_copy_blank)
  833.           fputc(NL, tmp); /* add blank line after header */
  834.   
  835.       cptr->art = article;
  836.       cptr->grp = group_hd;
  837. -     fclose(tmp);
  838.       goto out;
  839.   
  840.        case OK_BODY:
  841. --- 889,897 ----
  842.       if (mode == 1 && !last_copy_blank)
  843.           fputc(NL, tmp); /* add blank line after header */
  844.   
  845. +     if (fclose(tmp) == EOF) goto err;
  846.       cptr->art = article;
  847.       cptr->grp = group_hd;
  848.       goto out;
  849.   
  850.        case OK_BODY:
  851. ***************
  852. *** 896,902 ****
  853.       fseek(tmp, (off_t)0, 2);
  854.       if (copy_text(tmp) < 0)
  855.           return NULL;
  856. !     fclose(tmp);
  857.       goto out;
  858.       
  859.        case ERR_NOARTIG:
  860. --- 899,905 ----
  861.       fseek(tmp, (off_t)0, 2);
  862.       if (copy_text(tmp) < 0)
  863.           return NULL;
  864. !     if (fclose(tmp) == EOF) goto err;
  865.       goto out;
  866.       
  867.        case ERR_NOARTIG:
  868. ***************
  869. *** 911,916 ****
  870. --- 914,922 ----
  871.   
  872.    out:
  873.       return open_file(cptr->file_name, OPEN_READ|MUST_EXIST);
  874. +  err:
  875. +     sys_error('N', "Cannot write temporary file %s", cptr->file_name);
  876.   }
  877.   
  878.   /*
  879. *** ./LAST/patchlevel.h    Sat May  5 19:02:38 1990
  880. --- patchlevel.h    Thu May 10 13:06:05 1990
  881. ***************
  882. *** 10,16 ****
  883.    *    1989-09-08: Release 6.3.7    (FTP)
  884.    *    1990-03-03: Release 6.4beta    (FTP)
  885.    *    1990-05-07: Release 6.4        (comp.sources.unix)
  886.    */
  887.   
  888. ! #define PATCHLEVEL 0
  889.   
  890. --- 10,18 ----
  891.    *    1989-09-08: Release 6.3.7    (FTP)
  892.    *    1990-03-03: Release 6.4beta    (FTP)
  893.    *    1990-05-07: Release 6.4        (comp.sources.unix)
  894. +  *
  895. +  *    1990-05-10: Patch #1 (6.4.1)
  896.    */
  897.   
  898. ! #define PATCHLEVEL 1
  899.   
  900. *** ./LAST/sequence.c    Mon Apr 23 18:25:53 1990
  901. --- sequence.c    Tue May  8 15:15:11 1990
  902. ***************
  903. *** 348,356 ****
  904.           start_group_search(gname);
  905.   
  906.           while (gh = get_group_search()) {
  907.           if (!enter_sequence(mode, gh)) continue;
  908.   
  909. !         if (merge_groups && (gh->group_flag & G_UNSUBSCRIBED) == 0) {
  910.               if (mp_group == NULL) {
  911.               gh->group_flag |= G_MERGE_HEAD;
  912.               } else {
  913. --- 348,358 ----
  914.           start_group_search(gname);
  915.   
  916.           while (gh = get_group_search()) {
  917. +         if (merge_groups && gh->group_flag & G_UNSUBSCRIBED) continue;
  918.           if (!enter_sequence(mode, gh)) continue;
  919.   
  920. !         if (merge_groups) {
  921.               if (mp_group == NULL) {
  922.               gh->group_flag |= G_MERGE_HEAD;
  923.               } else {
  924. *** ./LAST/term.c    Thu Apr 26 21:15:34 1990
  925. --- term.c    Wed May  9 12:29:26 1990
  926. ***************
  927. *** 61,67 ****
  928.   static char XBC[64], XUP[64];
  929.   static char enter_ca_mode[64], exit_ca_mode[64];
  930.   static char cursor_home[64];
  931. ! static char cursor_address[64];
  932.   static char clear_screen[64];
  933.   static char clr_eol[64];
  934.   static char clr_eos[64];
  935. --- 61,67 ----
  936.   static char XBC[64], XUP[64];
  937.   static char enter_ca_mode[64], exit_ca_mode[64];
  938.   static char cursor_home[64];
  939. ! static char cursor_address[128];
  940.   static char clear_screen[64];
  941.   static char clr_eol[64];
  942.   static char clr_eos[64];
  943. *** ./LAST/variable.c    Wed May  2 17:30:03 1990
  944. --- variable.c    Wed May  9 17:48:38 1990
  945. ***************
  946. *** 35,40 ****
  947. --- 35,41 ----
  948.       *response_dflt_answer,
  949.       *save_counter_format,
  950.       *spell_checker,
  951. +     *trusted_escapes,
  952.       unshar_command[],
  953.       *unshar_header_file,
  954.       *user_shell;
  955. ***************
  956. *** 302,307 ****
  957. --- 303,309 ----
  958.       "suggest-default-save",     BOOL 0,        (char **)&suggest_save_file,
  959.       "tidy-newsrc",        BOOL 0,        (char **)&tidy_newsrc,
  960.       "time",            BOOL 0,        (char **)&show_current_time,
  961. +     "trusted-escape-codes",    STR 0,        (char **)&trusted_escapes,
  962.       "unshar-command",        STR SAFE 1,    (char **)unshar_command,
  963.       "unshar-header-file",    STR 0,        (char **)&unshar_header_file,
  964.       "unsubscribe-mark-read",    BOOL 4,        (char **)&keep_unsub_long,
  965.